#include "home_page.h"
#include "ui_home_page.h"

#include "weathertool.h"

Home_Page::Home_Page(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Home_Page)
{
    ui->setupUi(this);

    // 设置无边框样式
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);

//    // 设置窗口透明
//    ui->tabWidget->setWindowOpacity(0);

    // 登录窗口
    log_in.show();

    // 连接登录信号
    connect( &log_in , &MainWindow::log_in_yes , this , [=](QString con_user){
        qDebug() << "con_user" << con_user;
        // 将名字写入到成员变量中
        this->user = con_user;
        // 关闭登录窗口
        log_in.close();
        // 启动当前窗口
        this->show();
    });

    // 将控件添加到控件数组
    mWeekList << ui->lblWeek0 << ui->lblWeek1 << ui->lblWeek2 << ui->lblWeek3 << ui->lblWeek4 << ui->lblWeek5;
    // 日期列表
    mDateList << ui->lblDate0 << ui->lblDate1 << ui->lblDate2 << ui->lblDate3 << ui->lblDate4 << ui->lblDate5;

    // 天气和天气图标
    mTypeList << ui->lblType0 << ui->lblType1 << ui->lblType2 << ui->lblType3 << ui->lblType4 << ui->lblType5;
    mTypeIconList << ui->lblTypeIcon0 << ui->lblTypeIcon1 << ui->lblTypeIcon2 << ui->lblTypeIcon3 << ui->lblTypeIcon4 << ui->lblTypeIcon5;

    // 天气指数
    mAqiList << ui->lblQuality0 << ui->lblQuality1 << ui->lblQuality2 << ui->lblQuality3 << ui->lblQuality4 << ui->lblQuality5;

    // 风向和风力
    mFxList << ui->lblFx0 << ui->lblFx1 << ui->lblFx2 << ui->lblFx3 << ui->lblFx4 << ui->lblFx5;
    mFlList << ui->lblFl0 << ui->lblFl1 << ui->lblFl2 << ui->lblFl3 << ui->lblFl4 << ui->lblFl5;

    mTypeMap.insert("暴雪", ":/weather/res/type/BaoXue.png");
    mTypeMap.insert("暴雨", ":/weather/res/type/BaoYu.png");
    mTypeMap.insert("暴雨到大暴雨", ":/weather/res/type/BaoYuDaoDaBaoYu.png");
    mTypeMap.insert("大暴雨", ":/weather/res/type/DaBaoYu.png");
    mTypeMap.insert("大暴雨到特大暴雨", ":/weather/res/type/DaBaoYuDaoTeDaBaoYu.png");
    mTypeMap.insert("大到暴雪", ":/weather/res/type/DaDaoBaoXue.png");
    mTypeMap.insert("大雪", ":/weather/res/type/DaXue.png");
    mTypeMap.insert("大雨", ":/weather/res/type/DaYu.png");
    mTypeMap.insert("冻雨", ":/weather/res/type/DongYu.png");
    mTypeMap.insert("多云", ":/weather/res/type/DuoYun.png");
    mTypeMap.insert("浮沉", ":/weather/res/type/FuChen.png");
    mTypeMap.insert("雷阵雨", ":/weather/res/type/LeiZhenYu.png");
    mTypeMap.insert("雷阵雨伴有冰雹", ":/weather/res/type/LeiZhenYuBanYouBingBao.png");
    mTypeMap.insert("霾", ":/weather/res/type/Mai.png");
    mTypeMap.insert("强沙尘暴", ":/weather/res/type/QiangShaChenBao.png");
    mTypeMap.insert("晴", ":/weather/res/type/Qing.png");
    mTypeMap.insert("沙尘暴", ":/weather/res/type/ShaChenBao.png");
    mTypeMap.insert("特大暴雨", ":/weather/res/type/TeDaBaoYu.png");
    mTypeMap.insert("undefined", ":/weather/res/type/undefined.png");
    mTypeMap.insert("雾", ":/weather/res/type/Wu.png");
    mTypeMap.insert("小到中雪", ":/weather/res/type/XiaoDaoZhongXue.png");
    mTypeMap.insert("小到中雨", ":/weather/res/type/XiaoDaoZhongYu.png");
    mTypeMap.insert("小雪", ":/weather/res/type/XiaoXue.png");
    mTypeMap.insert("小雨", ":/weather/res/type/XiaoYu.png");
    mTypeMap.insert("雪", ":/weather/res/type/Xue.png");
    mTypeMap.insert("扬沙", ":/weather/res/type/YangSha.png");
    mTypeMap.insert("阴", ":/weather/res/type/Yin.png");
    mTypeMap.insert("雨", ":/weather/res/type/Yu.png");
    mTypeMap.insert("雨夹雪", ":/weather/res/type/YuJiaXue.png");
    mTypeMap.insert("阵雪", ":/weather/res/type/ZhenXue.png");
    mTypeMap.insert("阵雨", ":/weather/res/type/ZhenYu.png");
    mTypeMap.insert("中到大雪", ":/weather/res/type/ZhongDaoDaXue.png");
    mTypeMap.insert("中到大雨", ":/weather/res/type/ZhongDaoDaYu.png");
    mTypeMap.insert("中雪", ":/weather/res/type/ZhongXue.png");
    mTypeMap.insert("中雨", ":/weather/res/type/ZhongYu.png");

    // 网络请求天气预报
    mNetAccessManager = new QNetworkAccessManager(this);
    connect(mNetAccessManager,&QNetworkAccessManager::finished,this,&Home_Page::onReplid);

    // 请求北京天气数据
    //getWeatherInfo("101010100");
    //getWeatherInfo("101251004");// 汨罗
    getWeatherInfo("北京");

    // 5. 给标签添加事件过滤器
    // 参数指定为this，也就是当前窗口对象 MainWindow
    ui->lblHighCurve->installEventFilter(this);
    ui->lblLowCurve->installEventFilter(this);

    // 初始化音乐
    my_music();
}

Home_Page::~Home_Page()
{
    delete ui;
}

void Home_Page::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton) // 判断为左键按下
    {
        //event->globalPos() 鼠标按下的全局坐标
        //frameGeometry().topLeft() 当前界面的 左上角坐标
        off_Pox = event->globalPos() - frameGeometry().topLeft();
        // qDebug() << "左键按下";
        is_key = true;
    }
}

void Home_Page::mouseReleaseEvent(QMouseEvent *event)
{
    if(is_key)
    {
        is_key = false;
    }
}

void Home_Page::mouseMoveEvent(QMouseEvent *event)
{
    if(is_key)
    {
        // qDebug() << event->globalPos();
        // 移动界面
        this->move(event->globalPos() - off_Pox);
    }
}

void Home_Page::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Escape)
    {
        // qDebug() << "esc按下";
        this->close();
    }
}

// 获得天气数据
void Home_Page::getWeatherInfo(QString cityName)
{
    QString cityCode = weathertool::getcityCode(cityName);
    if (cityCode.isEmpty()) {
        QMessageBox::warning(this, "错误", "请检查是否有该城市，并没有该城市的数据！", QMessageBox::Ok);
        return;
    }

    QUrl url("http://t.weather.itboy.net/api/weather/city/" + cityCode);
    mNetAccessManager->get(QNetworkRequest(url));
}

// 解析
void Home_Page::parseJson(QByteArray &byteArray)
{
    QJsonParseError err;
    QJsonDocument doc = QJsonDocument::fromJson(byteArray,&err);
    if(err.error != QJsonParseError::NoError)
    {
        return;
    }
    QJsonObject rootObj = doc.object();
    // qDebug()<< rootObj.value("message").toString();

    // 1. 解析日期和城市
    mToday.date = rootObj.value("date").toString();
    mToday.city = rootObj.value("cityInfo").toObject().value("city").toString();

    // 2. 解析yesterday
    QJsonObject objData = rootObj.value("data").toObject();

    QJsonObject objYesterday = objData.value("yesterday").toObject();
    mDay[0].week = objYesterday.value("week").toString();
    mDay[0].date = objYesterday.value("ymd").toString();
    mDay[0].type = objYesterday.value("type").toString();

    // 高温低温
    QString highStr = objYesterday["high"].toString();
    QString lowStr = objYesterday["low"].toString();
    int highTemp = highStr.mid(2, highStr.length() - 3).toInt();
    int lowTemp = lowStr.mid(2, lowStr.length() - 3).toInt();
    mDay[0].high = highTemp;
    mDay[0].low = lowTemp;
    // qDebug() << "最高温度: " << mDay[0].high << "℃";
    // qDebug() << "最低温度: " << mDay[0].low << "℃";

    // 风向风力
    mDay[0].fx = objYesterday.value("fx").toString();
    mDay[0].fl = objYesterday.value("fl").toString();

    // 污染指数
    mDay[0].aqi = objYesterday.value("aqi").toDouble();

    // 3. 解析forecast中5天的数据
    QJsonArray forecastArr = objData.value("forecast").toArray();

    for(int i = 0; i < 5; i++) {
        QJsonObject objForecast = forecastArr[i].toObject();
        mDay[i + 1].week = objForecast.value("week").toString();
        mDay[i + 1].date = objForecast.value("ymd").toString();

        // 天气类型
        mDay[i + 1].type = objForecast.value("type").toString();

        // 高温低温
        QString highStr = objForecast["high"].toString();
        QString lowStr = objForecast["low"].toString();
        int highTemp = highStr.mid(2, highStr.length() - 3).toInt();
        int lowTemp = lowStr.mid(2, lowStr.length() - 3).toInt();
        mDay[i + 1].high = highTemp;
        mDay[i + 1].low = lowTemp;
        //qDebug() << "最高温度: " << highTemp << "℃";
        //qDebug() << "最低温度: " << lowTemp << "℃";

        // 风向风力
        mDay[i + 1].fx = objForecast.value("fx").toString();
        mDay[i + 1].fl = objForecast.value("fl").toString();

        // 污染指数
        mDay[i + 1].aqi = objForecast.value("aqi").toDouble();
    }

    // 4. 解析今天的数据
    mToday.ganmao = objData.value("ganmao").toString();
    QString wendu = objData["wendu"].toString();
    mToday.wendu = wendu;
    // qDebug() << "当前温度: " << mToday.wendu;
    mToday.shidu = objData.value("shidu").toString();
    mToday.pm25 = objData.value("pm25").toDouble();
    mToday.quality = objData.value("quality").toString();

    // 5. forecast中第一个数组元素，也是今天的数据
    mToday.type = mDay[1].type;
    mToday.fx = mDay[1].fx;
    mToday.fl = mDay[1].fl;
    mToday.high = mDay[1].high;
    // qDebug() << "最高温" << mToday.high;
    mToday.low = mDay[1].low;
    // qDebug() << "最低温" << mToday.low;

    // 6. 更新 UI
    // 6.1 显示文本和图标
    updateUI();
    // 6.2 绘制温度曲线
    ui->lblHighCurve->update();
    ui->lblLowCurve->update();
}

// 更新UI界面
void Home_Page::updateUI()
{
    // 1.更新日期和城市
    ui->lblDate->setText(QDateTime::fromString(mToday.date,"yyyyMMdd").toString("yyyy/MM/dd") + " " + mDay[1].week);
    ui->lblCity->setText(mToday.city);

    // 2. 更新今天
    ui->lblTypeIcon->setPixmap(mTypeMap[mToday.type]);
    ui->lblTemp->setText(mToday.wendu);
    ui->lblType->setText(mToday.type);
    ui->lblLowHigh->setText(QString::number(mToday.low) + "~" + QString::number(mToday.high) + "°C");
    ui->lblGanMao->setText("感冒指数: " + mToday.ganmao);
    ui->lblWindFx->setText(mToday.fx);
    ui->lblWindFl->setText(mToday.fl);
    ui->lblPM25->setText(QString::number(mToday.pm25));
    ui->lblShiDu->setText(mToday.shidu);
    ui->lblQuality->setText(mToday.quality);

    // 3. 更新六天
    for(int i = 0; i < 6; i++) {
        // 3.1 更新日期和时间
        mWeekList[i]->setText("周" + mDay[i].week.right(1));
        ui->lblWeek0->setText("昨天");
        ui->lblWeek1->setText("今天");
        ui->lblWeek2->setText("明天");

        QStringList ymd_list = mDay[i].date.split("-");
        mDateList[i]->setText(ymd_list[1] + "/" + ymd_list[2]);

        // 3.2 更新天气类型
        mTypeList[i]->setText(mDay[i].type);
        mTypeIconList[i]->setPixmap(mTypeMap[mDay[i].type]);

        // 3.3 更新空气质量
        if (mDay[i].aqi >= 0 && mDay[i].aqi <= 50) {
            mAqiList[i]->setText("优");
            //mAqiList[i]->setStyleSheet("background - color: rgb(121, 184, 0);");
        } else if (mDay[i].aqi > 50 && mDay[i].aqi <= 100) {
            mAqiList[i]->setText("良");
            //mAqiList[i]->setStyleSheet("background - color: rgb(255, 187, 23);");
        } else if (mDay[i].aqi > 100 && mDay[i].aqi <= 150) {
            mAqiList[i]->setText("轻度");
            //mAqiList[i]->setStyleSheet("background - color: rgb(255, 87, 97);");
        } else if (mDay[i].aqi > 150 && mDay[i].aqi <= 200) {
            mAqiList[i]->setText("中度");
            //mAqiList[i]->setStyleSheet("background - color: rgb(235, 17, 27);");
        } else if (mDay[i].aqi > 200 && mDay[i].aqi <= 250) {
            mAqiList[i]->setText("重度");
            //mAqiList[i]->setStyleSheet("background - color: rgb(170, 0, 0);");
        } else {
            mAqiList[i]->setText("严重");
            //mAqiList[i]->setStyleSheet("background - color: rgb(110, 0, 0);");
        }

        // 3.4 更新风力、风向
        mFxList[i]->setText(mDay[i].fx);
        mFlList[i]->setText(mDay[i].fl);
    }
}

// 绘制折线图
bool Home_Page::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == ui->lblHighCurve && event->type() == QEvent::Paint) {
        paintHighCurve();
    }

    if (watched == ui->lblLowCurve && event->type() == QEvent::Paint) {
        paintLowCurve();
    }

    return QWidget::eventFilter(watched, event);
}

// 绘制高温
void Home_Page::paintHighCurve()
{
    QPainter painter(ui->lblHighCurve);
    // 抗锯齿
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 1. 获取x坐标
    int pointX[6] = {0};
    for (int i = 0; i < 6; i++) {
        pointX[i] = mWeekList[i]->pos().x() + mWeekList[i]->width() / 2;
    }

    // 2. 获取y坐标
    int tempSum = 0;
    int tempAverage = 0;
    for (int i = 0; i < 6; i++) {
        tempSum += mDay[i].high;
    }
    tempAverage = tempSum / 6; // 最高温的平均值

    // 计算y轴坐标
    int pointY[6] = {0};
    int yCenter = ui->lblHighCurve->height() / 2;
    for (int i = 0; i < 6; i++) {
        pointY[i] = yCenter - ((mDay[i].high - tempAverage) * INCREMENT);
    }

    // 3. 开始绘制
    // 3.1 初始化画笔相关
    QPen pen = painter.pen();
    pen.setWidth(1);    // 设置画笔的宽度
    pen.setColor(QColor(255, 170, 0)); // 设置画笔的颜色

    painter.setPen(pen);
    painter.setBrush(QColor(255, 170, 0)); // 设置画刷的颜色-内部填充的颜色

    // 3.2 画点、写文本
    for (int i = 0; i < 6; i++) {
        // 显示点
        painter.drawEllipse(QPoint(pointX[i], pointY[i]), POINT_RADIUS, POINT_RADIUS);
        // 显示温度文本
        painter.drawText(pointX[i]-TEXT_OFFSET_X, pointY[i]-TEXT_OFFSET_Y, QString::number(mDay[i].high) + "°");
    }

    // 3.3 绘制曲线
    for (int i = 0; i < 5; i++) {
        if (i == 0) {
            pen.setStyle(Qt::DotLine);    // 虚线
            painter.setPen(pen);
        } else {
            pen.setStyle(Qt::SolidLine);  // 实线
            painter.setPen(pen);
        }
        painter.drawLine(pointX[i], pointY[i], pointX[i + 1], pointY[i + 1]);
    }
}

// 绘制低温
void Home_Page::paintLowCurve()
{
    QPainter painter(ui->lblLowCurve);
    // 抗锯齿
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 1. 获取x坐标
    int pointX[6] = {0};
    for (int i = 0; i < 6; i++) {
        pointX[i] = mWeekList[i]->pos().x() + mWeekList[i]->width() / 2;
    }

    // 2. 获取y坐标
    int tempSum = 0;
    int tempAverage = 0;
    for (int i = 0; i < 6; i++) {
        tempSum += mDay[i].low;
    }
    tempAverage = tempSum / 6; // 最高温的平均值

    // 计算y轴坐标
    int pointY[6] = {0};
    int yCenter = ui->lblLowCurve->height() / 2;
    for (int i = 0; i < 6; i++) {
        pointY[i] = yCenter - ((mDay[i].low - tempAverage) * INCREMENT);
    }

    // 3. 开始绘制
    // 3.1 初始化画笔相关
    QPen pen = painter.pen();
    pen.setWidth(1);    // 设置画笔的宽度
    pen.setColor(QColor(0, 255, 255)); // 设置画笔的颜色

    painter.setPen(pen);
    painter.setBrush(QColor(0, 255, 255)); // 设置画刷的颜色-内部填充的颜色

    // 3.2 画点、写文本
    for (int i = 0; i < 6; i++) {
        // 显示点
        painter.drawEllipse(QPoint(pointX[i], pointY[i]), POINT_RADIUS, POINT_RADIUS);
        // 显示温度文本
        painter.drawText(pointX[i]-TEXT_OFFSET_X, pointY[i]-TEXT_OFFSET_Y, QString::number(mDay[i].low) + "°");
    }

    // 3.3 绘制曲线
    for (int i = 0; i < 5; i++) {
        if (i == 0) {
            pen.setStyle(Qt::DotLine);    // 虚线
            painter.setPen(pen);
        } else {
            pen.setStyle(Qt::SolidLine);  // 实线
            painter.setPen(pen);
        }
        painter.drawLine(pointX[i], pointY[i], pointX[i + 1], pointY[i + 1]);
    }
}

// 发送网络请求天气
void Home_Page::onReplid(QNetworkReply *reply)
{
    // qDebug() << "请求成功";

    int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

    if (reply->error() != QNetworkReply::NoError || status_code != 200) {
        qDebug() << "出错啦";
    }else{
        QByteArray reply_data = reply->readAll();
        QString jsonString = QString::fromUtf8(reply_data);
        // qDebug() << "read all" << jsonString;

        parseJson(reply_data);
    }

    reply->deleteLater();
}

// 搜索城市
void Home_Page::on_researchButton_clicked()
{
    QString cityName = ui->inputresearch->text();
    getWeatherInfo(cityName);
}

// 晚安
void Home_Page::on_pushButton_night_clicked()
{
    ui->label->setPixmap(QPixmap(":/img/img_29 .png"));
    QMessageBox::information(this,"晚安","晚安，主人，祝好梦!",QMessageBox::Ok);
}

// 回家
void Home_Page::on_pushButton_home_clicked()
{
    ui->label->setPixmap(QPixmap(":/img/img_26.png"));
    QMessageBox::information(this,"回家","主人，欢迎回家!",QMessageBox::Ok);
}

// 出门
void Home_Page::on_pushButton_out_clicked()
{
    ui->label->setPixmap(QPixmap(":/img/img_27.png"));
    QMessageBox::information(this,"出门","主人，注意安全!",QMessageBox::Ok);
}

// 起床
void Home_Page::on_pushButton_getbed_clicked()
{
    ui->label->setPixmap(QPixmap(":/img/img_28.png"));
    QMessageBox::information(this,"早安","主人，早上好!",QMessageBox::Ok);
}
